/*
 * Autor Edivã  20/11/2014
 *
 */
#include <mutex>
#include <thread>
#include "../include/estatistica.h"


void Estatisticas::criaPasta(){


	//std::string data = (std::string)_TIME_;  // strcat(data,);
	std::ostringstream* c = new std::ostringstream;
	*c <<"../../dadosCoordenadas"<< std::ends;
	sPastaSalvaDados = c->str().c_str();

}
void Estatisticas::setBola(Matriz4d boll){

	bola.push_back(boll);
}


void Estatisticas::setDadosAgente(Agente agent, int pos){//guarda a cada mensagem o agente dentro do vetor para seus respectivos agentes
	std::mutex mutex;
	std::lock_guard<std::mutex> lock(mutex);

    //agente.push_back(agent);
	 vetAgente[pos].addPosicoesAgente(agent);

}

void Estatisticas::setAgentes(Agente agent , int pos){

	std::mutex mutex;
	std::lock_guard<std::mutex> lock(mutex);
	vetAgente[pos]= agent;
}

Agente Estatisticas::atualizaAgente(int pos){

	return vetAgente[pos];
}

void Estatisticas::salvaDadosAgentes(int quan){

	criaPasta();
	std::ostringstream* c = new std::ostringstream;

	*c <<"mkdir "<<sPastaSalvaDados<< std::ends;
	std::string pasta=c->str().c_str();

	system(pasta.c_str());//criar pasta para salvar arquivos das coordenadas


    for(int l=1;l<quan;l++){


    		  if(vetAgente[l].getNumero()!=NULL )
    	       gravaCoordenadasCSV(vetAgente[l].getVetorPosicoes());

    }
    gravaCoordendasBola(vetAgente[1].getVetorPosicoes());  //gravando coordenadas da bola

    std::cout<<"\nGravação de coordenadas de bolas e agentes"<<std::endl;

}


void Estatisticas::setMensagemsRecebidas(int complet, int parc, int cort , double timpJogo, std::string scoLef, std::string scoRig){

   iQuantMensaCompl=complet;
   iQuantMensagParcial=parc;
   iQuantMensCortada = cort;
   dTempoTotalJogo = timpJogo;
   sScoreLeft=scoLef;
   sScoreRight = scoRig;

}


void Estatisticas::resulmoJogo(int quan){

	 int i,nQ;
	 double temQ;
     std::vector<Agente> m;
     int tam, nuAgent;
     iTotalQuedas=0;
     dTotalTempoQuedas=0;
	 std::ofstream fout("../../dadosEstatisticas.txt"); // Cria arquivo para gravação

	 nuAgent=quan-1;

	 fout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
			 "NumeroAgente\tTime\tQuan.Quedas\tTempQuedas\n";

	 for(i=1;i<quan;i++){
		  m= vetAgente[i].getVetorPosicoes();
		 tam = m.size();
         nQ =Agente(m[tam-1]).getQuedas();
         temQ=Agente(m[tam-1]).getTemcaido();
	     //std::cout<<";
		 if(vetAgente[i].getQuedas()==0)vetAgente[i].setTimCaido(0.0);
	     fout <<vetAgente[i].getNumero()<<"\t\t"<<vetAgente[i].getLado() <<"\t"<<nQ<<"\t\t"<<temQ;
		 fout << "\n+++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

         iTotalQuedas = iTotalQuedas+nQ;
         dTotalTempoQuedas = dTotalTempoQuedas+temQ;

	 }
	 fout <<"Totais\t\t\t"<<iTotalQuedas<<"\t\t"<<dTotalTempoQuedas;



	 fout <<"\n\n***Relatório do Jogo ***\n";

	 fout <<"Quantidade de Mensagens completas:"<<iQuantMensaCompl<<"\n";
	 fout <<"Quantidade de Mensagens cortadas:"<<iQuantMensCortada<<"\n";
	 fout <<"Quantidade de Mensagens parciais:"<<iQuantMensagParcial<<"\n";
	 fout <<"Quantidade de Agentes:"<<nuAgent<<"\n";
	// fout <<"Total tempo de quedas:"<<dTotalTempoQuedas<<"\n";
	 fout <<"Tempo total da partida:"<<dTempoTotalJogo<<"\n";
	 fout <<"Score_Left:"<<sScoreLeft<<" Score_Right:"<<sScoreRight<<"\n";
     fout <<"Media de quedas durante partida:"<<iTotalQuedas/nuAgent<<"\n";
     fout <<"Tempo médio de quedas partida:"<<dTotalTempoQuedas/iTotalQuedas<<"\n";

	 fout.close();//fechar arquivo

	 std::cout<<"Gravação de Estatísticas com sucesso\n";


}

void Estatisticas::gravaCoordendasBola(std::vector<Agente> vAgenteB){

	  char DELIMITADOR=';';
	  Matriz4d objBola;
	/*concatenando string*/
	  std::vector<Agente>::const_iterator ib;
	 std::ostringstream* c = new std::ostringstream;
	 *c << sPastaSalvaDados<<"/bola"<<".xls"<< std::ends;
	 std::string arq = c->str().c_str();

	//if(!bola.empty()){

		graCoorEst.open(arq);

		graCoorEst<<"Tempo"<<DELIMITADOR<<"Bola"<<DELIMITADOR;
		graCoorEst<<"N_X"<<DELIMITADOR<<"N_Y"<<DELIMITADOR<<"N_Z"<<DELIMITADOR<<"N_E"<<DELIMITADOR;
	    graCoorEst<<"O_X"<<DELIMITADOR<<"O_Y"<<DELIMITADOR<<"O_Z"<<DELIMITADOR<<"O_E"<<DELIMITADOR;
		graCoorEst<<"A_X"<<DELIMITADOR<<"A_Y"<<DELIMITADOR<<"A_Z"<<DELIMITADOR<<"A_E"<<DELIMITADOR;
		graCoorEst<<"P_X"<<DELIMITADOR<<"P_Y"<<DELIMITADOR<<"P_Z"<<DELIMITADOR<<"P_E"<<DELIMITADOR;
		graCoorEst<<"PLAYMODE"<<DELIMITADOR;
		graCoorEst<<"\n";//pula para proxima linha

		for(ib=vAgenteB.begin(); ib!=vAgenteB.end(); ib++){
			 graCoorEst<<((Agente)*ib).getTimeAgene()<<DELIMITADOR;
			 objBola=((Agente)*ib).getBollM4();
			 graCoorEst<<DELIMITADOR<<objBola.getNormal().X()<<DELIMITADOR<<objBola.getNormal().Y()<<DELIMITADOR<<objBola.getNormal().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
			 graCoorEst<<objBola.getOrientation().X()<<DELIMITADOR<<objBola.getOrientation().Y()<<DELIMITADOR<<objBola.getOrientation().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
			 graCoorEst<<objBola.getApproach().X()<<DELIMITADOR<<objBola.getApproach().Y()<<DELIMITADOR<<objBola.getApproach().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
			 graCoorEst<<objBola.getPosition().X()<<DELIMITADOR<<objBola.getPosition().Y()<<DELIMITADOR<<objBola.getPosition().Z()<<DELIMITADOR<<"1"<<DELIMITADOR;
			 graCoorEst<<((Agente)*ib).getPlayMode()<<DELIMITADOR;
			 graCoorEst<<"\n";//pula para proxima linha
		}

		graCoorEst.close();

   // }


}

void Estatisticas::gravaCoordenadasCSV(std::vector<Agente> vAgente){

	 char DELIMITADOR=';';
     double timeAnterior;


     int i=0,ip,tam;
	 std::string nomeMembro,status;

	 Agente objAgente;



	 /*concatenando string*/
	 std::ostringstream* c = new std::ostringstream;
	 *c << sPastaSalvaDados<<"/Agente"<<vAgente[1].getLado() <<vAgente[1].getNumero()<<".xls"<< std::ends;
	 std::string d = c->str().c_str();

	 tam=vAgente.size();//pegar tamanho do vetor
	//graCoorEst.open(d, std::ios::app  );

   if(tam){
	graCoorEst.open(d);

	graCoorEst<<"NumAgente:"<<DELIMITADOR<<"Lado"<<DELIMITADOR<<"QuantQuedas"<<DELIMITADOR<<"TemQuedas:"<<"\n";
	graCoorEst<<vAgente[1].getNumero()<<DELIMITADOR<<vAgente[1].getLado()<<DELIMITADOR<<vAgente[tam-1].getQuedas()<<DELIMITADOR<<vAgente[tam-1].getTemcaido() <<DELIMITADOR<<"\n";


	/*Dados gravados na memoria durante todo jogo*/
	graCoorEst<<"Tempo"<<DELIMITADOR<<"Caido"<<DELIMITADOR;

	for(ip=1;ip<13;ip++){

	 if(ip==1) nomeMembro="Head"; if(ip==2) nomeMembro="body"; if(ip==3) nomeMembro="Rupperarm"; if(ip==4) nomeMembro="Rlowerarm"; if(ip==5) nomeMembro="Lupperarm"; if(ip==6) nomeMembro="Llowerarm";
     if(ip==7) nomeMembro="Rthigh";if(ip==8) nomeMembro="Rshank"; if(ip==9) nomeMembro="Rfoot"; if(ip==10) nomeMembro="Lthigh"; if(ip==11) nomeMembro="Lshank";if(ip==12) nomeMembro="Lfoot";
	 graCoorEst<<nomeMembro<<DELIMITADOR<<"N_X"<<DELIMITADOR<<"N_Y"<<DELIMITADOR<<"N_Z"<<DELIMITADOR<<"N_E"<<DELIMITADOR;
	 graCoorEst<<"O_X"<<DELIMITADOR<<"O_Y"<<DELIMITADOR<<"O_Z"<<DELIMITADOR<<"O_E"<<DELIMITADOR;
	 graCoorEst<<"A_X"<<DELIMITADOR<<"A_Y"<<DELIMITADOR<<"A_Z"<<DELIMITADOR<<"A_E"<<DELIMITADOR;
	 graCoorEst<<"P_X"<<DELIMITADOR<<"P_Y"<<DELIMITADOR<<"P_Z"<<DELIMITADOR<<"P_E"<<DELIMITADOR;
	}

	graCoorEst<<"\n";//pula para proxima linha



	for(it=vAgente.begin(); it!=vAgente.end(); it++){

		   i++;

		  objAgente=((Agente)*it);

		  if(timeAnterior!=objAgente.getTimeAgene()){


				  if(objAgente.getStatus()==true)status="Sim";else status="Nao";
				  graCoorEst<<objAgente.getTimeAgene()<<DELIMITADOR<<status<<DELIMITADOR;

				  for(ip=1;ip<13;ip++){
				   graCoorEst<<DELIMITADOR<<objAgente.getParteAgente(ip).getNormal().X()<<DELIMITADOR<<objAgente.getParteAgente(ip).getNormal().Y()<<DELIMITADOR<<objAgente.getParteAgente(ip).getNormal().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
				   graCoorEst<<objAgente.getParteAgente(ip).getOrientation().X()<<DELIMITADOR<<objAgente.getParteAgente(ip).getOrientation().Y()<<DELIMITADOR<<objAgente.getParteAgente(ip).getOrientation().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
				   graCoorEst<<objAgente.getParteAgente(ip).getApproach().X()<<DELIMITADOR<<objAgente.getParteAgente(ip).getApproach().Y()<<DELIMITADOR<<objAgente.getParteAgente(ip).getApproach().Z()<<DELIMITADOR<<"0"<<DELIMITADOR;
				   graCoorEst<<objAgente.getParteAgente(ip).getPosition().X()<<DELIMITADOR<<objAgente.getParteAgente(ip).getPosition().Y()<<DELIMITADOR<<objAgente.getParteAgente(ip).getPosition().Z()<<DELIMITADOR<<"1"<<DELIMITADOR;
				  }

				  timeAnterior=objAgente.getTimeAgene();
				  graCoorEst<<"\n";//pula para proxima linha

		    }

	   }


	graCoorEst.close();



   // std::cout<<"\nGravação de coordenadas do agente "<<vAgente[1].getNumero()<<"  "<<vAgente[1].getLado()<<" com sucesso\n números de registros:"<<i<<std::endl;

   }else
     std::cout<<"Não existe dados para gravação\n";

}


